/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package network;

/**
 *
 * @author Raise
 */

/**
 * 神经网络层抽象基类
 * 定义了所有神经网络层必须实现的基本接口和工具方法
 */
public abstract class Layer {
    protected int inputSize;        //该层的输入大小
    protected int outputSize;       //该层的输出大小
    
    
    /**
     * 前向传播方法
     * 接收输入数据，经过该层的计算后返回输出结果
     * 
     * @param input 输入数据，长度为inputSize的一维数组
     * @return 输出数据，长度为outputSize的一维数组
     */
    public abstract double[] forward(double[] input);
    
    /**
     * 反向传播方法
     * 根据损失函数的梯度，计算并传播梯度，同时更新该层的参数
     * 
     * @param gradient 从下一层传递来的梯度，长度为outputSize
     * @param learningRate 学习率，控制参数更新的步长
     * @return 传递给前一层的梯度，长度为inputSize
     */
    public abstract double[] backward(double[] gradient, double learningRate);
    
    /**
     * 工具方法：找到数组中最大值的索引
     * 常用于分类任务中找到概率最大的类别
     * 
     * @param array 输入数组
     * @return 最大值所在的索引位置
     * 
     * 示例：
     *  输入: [0.1, 0.3, 0.05, 0.55]
     *  返回: 3 (因为0.55是最大值，索引为3)
     */
    protected int argmax(double[] array) {
        int maxIndex = 0;// 初始化最大值索引为0
        for (int i = 1; i < array.length; i++) {
            // 如果当前元素大于已知最大值
            if (array[i] > array[maxIndex]) {
                maxIndex = i;  // 更新最大值索引
            }
        }
        return maxIndex;
    }
}
